home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 41 / Amiga Format CD41 (1999-06)(Future Publishing)(GB)[!][issue 1999-07].iso / -seriously_amiga- / cd-rom / acdb / src / acdb_net.e < prev    next >
Text File  |  1999-04-28  |  6KB  |  281 lines

  1. OPT MODULE,OSVERSION=37
  2. OPT PREPROCESS,REG=5
  3.  
  4.  
  5. /*
  6.  *-- AutoRev header do NOT edit!!
  7.  *
  8.  *   Project         :   ACDB (AMIGA CD Base) - program obsîugujâcy CDDB
  9.  *   File            :   acdb_net.e
  10.  *   Description     :   obsîuga HTTP-GET via bsdsocket.library
  11.  *   Copyright       :   ©1999, Piotr Gapiïski
  12.  *   Author          :   Piotr Gapiïski
  13.  *   Creation Date   :   09.03.99
  14.  *   Current version :   1.0
  15.  *   Translator      :   AmigaE v3.3a
  16.  *
  17.  *
  18.  *-- REVISION HISTORY
  19.  *
  20.  *   0.5 (05.01.99)
  21.  *    o   jednolita konwencja nazw procedur w module
  22.  *    o   moûliwoôê przerwania odbioru danych przez wysîanie sygnaîy CTRL-D
  23.  *    o   procedura umoûliwiajâca przerwanie pëtli odbioru procedury netReceive()
  24.  *    o   procedura metSendcmd() jest teraz zgodna z HTTP1.0 oraz HTTP1.1
  25.  *        (koniec linii CRFL,CRLF)
  26.  *
  27.  *   0.5 (05.01.99)
  28.  *    o   nowa procedura odbierajâca dane receive()
  29.  *        zajmuje sië takûe obsîugâ interfejsu uûytkownika (parametr gui=NIL)
  30.  *
  31.  *   0.4 (03.01.99)
  32.  *    o   wysyîanie metody GET koïczy sië teraz sekwencjâ CRLF (patrz RFC1945)
  33.  *
  34.  *   0.3 (28.12.98)
  35.  *    o   wysyîanie znacznika HTTP/1.0 zablokowane
  36.  *        zdaje sië, ûe to i tak nie dziaîaîo...
  37.  *
  38.  *   0.2 (26.12.98)
  39.  *    o   netperror() zablokowana - aû tak szczegóîowe komunikaty o bîëdach sâ zbëdne
  40.  *    o   poîâczenia sâ tylu KEEPALIVE dziëki czemu pomiëdzy poszczególnymi wywoîaniami
  41.  *        Send() poîâczenie nie jest koïczone
  42.  *
  43.  *   0.1 (22.12.98)
  44.  *    o   pierwsza wersja (BETA)
  45.  *        wzorowane na httpget z pakietu amitcp/ip
  46.  *
  47.  */
  48.  
  49.  
  50. MODULE 'tools/easygui'
  51. MODULE 'amiTCP/netdb','amiTCP/netinet/in','amiTCP/sys/socket'
  52. MODULE 'amiTCP/amiTCP/socketbasetags','bsdsocket','utility/tagitem','dos/dos','exec/tasks'
  53. MODULE '*acdb_debug','*acdb_gui'
  54.  
  55.   #ifdef DEBUG
  56.     MODULE 'tools/debug'
  57.     #define D(a,b) kputfmt(a,b)
  58.   #endif
  59.   #ifndef DEBUG
  60.     #define D(a,b)
  61.   #endif
  62.  
  63.  
  64. EXPORT PROC netSetup()
  65.  
  66.   ->-
  67.   ->- procedura inicjalizujâca obsîugë sieci
  68.   ->- zwraca TRUE/FALSE
  69.   ->-
  70.  
  71.   DEF rc
  72.  
  73.   socketbase := OpenLibrary('bsdsocket.library', 4)
  74.   rc := IF (socketbase) THEN TRUE ELSE FALSE
  75. ENDPROC rc
  76.  
  77.  
  78.  
  79. EXPORT PROC netCleanUp()
  80.  
  81.   ->-
  82.   ->- procedura zwalniajâca zasoby zaalokowane przez netSetup()
  83.   ->- nie zwraca ûadnej wartoôci
  84.   ->-
  85.  
  86.   IF (socketbase) THEN CloseLibrary(socketbase)
  87.   socketbase := NIL
  88. ENDPROC
  89.  
  90.  
  91.  
  92. EXPORT PROC netConnect(host:PTR TO CHAR, port)
  93.  
  94.   ->-
  95.   ->- top-level, poîâczenie z wybranym hostem przez odpowiedni port
  96.   ->- w wypadku bîëdu zwraca (-1) zamiast FALSE!!!
  97.   ->- zwraca deskryptor gniazda (>0) lub kod bîëdu (-1)
  98.   ->-
  99.  
  100.   DEF addr:sockaddr_in
  101.  
  102.   bzero(addr, SIZEOF sockaddr_in)
  103.   IF getsockaddr(host, port,addr)=FALSE THEN RETURN (-1)
  104. ENDPROC inetconn(addr)
  105.  
  106.  
  107.  
  108. EXPORT PROC netSendcmd(sd, cmd:PTR TO CHAR)
  109.  
  110.   ->-
  111.   ->- wysîanie komendy przez HTTP1.0/GET (wymagany tryb NONBLOCKING)
  112.   ->- komenda musi(?) koïczyê sië znakami CRLFCRLF
  113.   ->- zwraca TRUE/FALSE
  114.   ->-
  115.  
  116.   DEF len
  117.  
  118.   LowerStr(cmd)
  119.   len := StrLen(cmd)
  120.   IF (Send(sd, 'GET ', STRLEN, 0) <> STRLEN) OR
  121.      (Send(sd, cmd, len, 0) <> len) OR
  122.      (Send(sd, '\b\n\b\n', STRLEN, 0) <> STRLEN) THEN RETURN FALSE
  123. ENDPROC TRUE
  124.  
  125.  
  126.  
  127. EXPORT PROC netReceive(sd, buff:PTR TO CHAR, max)
  128.  
  129.   ->-
  130.   ->- odbiera max bajtów do bufora w paczkach po 100 bajtów
  131.   ->- odbiór moûna przerwaê wysyîajâc do tasku programu sygnaî CTRL-D
  132.   ->- zwraca TRUE/FALSE (TRUE gdy wszystkie dane zostaîy odebrane)
  133.   ->-
  134.  
  135.   DEF len=0, i=0
  136.  
  137.   SetSignal(0, SIGBREAKF_CTRL_D)
  138.   WHILE TRUE
  139.  
  140.     ->-
  141.     ->- ûâdanie przerwania odczytu?
  142.     ->-
  143.  
  144.     guiCheckGadgets()
  145.     IF (SetSignal(0, SIGBREAKF_CTRL_D) AND SIGBREAKF_CTRL_D) THEN RETURN FALSE
  146.  
  147.     EXIT (len > max)
  148.  
  149.     i := Recv(sd, (buff + len), 100, 0)
  150.     EXIT (i<=0)
  151.  
  152.     len := len + i
  153.   ENDWHILE
  154.  
  155.   ->-
  156.   ->- i=0 oznacza koniec odbioru
  157.   ->-
  158.  
  159.   IF (len > max) OR (i < 0) THEN RETURN FALSE
  160. ENDPROC len
  161.  
  162.  
  163.  
  164. EXPORT PROC netAbort()
  165.  
  166.   ->-
  167.   ->- procedura wysyîajâca do programu sygnaî przerwania odczytu
  168.   ->- nie zwraca ûadnej wartoôci
  169.   ->-
  170.  
  171.   Signal(FindTask(NIL), SIGBREAKF_CTRL_D)
  172. ENDPROC
  173.  
  174.  
  175.  
  176.   ->-
  177.   ->- prywatne
  178.   ->- procedury wspomagajâce obsîugë sieci
  179.   ->-
  180.  
  181.  
  182.  
  183. PROC getsockaddr(host:PTR TO CHAR, port, addr:PTR TO sockaddr_in)
  184.  
  185.   ->-
  186.   ->- middle-level, inicjalizacja struktury sockaddr_in
  187.   ->- zwraca TRUE/FALSE (FALSE gdy nie moûna znaleúê hosta w sieci)
  188.   ->-
  189.  
  190.   DEF remote:PTR TO hostent
  191.  
  192.   IF (remote := Gethostbyname(host))
  193.     bcopy(remote.h_addr, addr.addr, remote.length)
  194.   ELSE
  195.     addr.addr.addr := Inet_addr(host)
  196.     IF (addr.addr.addr = -1) THEN RETURN FALSE
  197.   ENDIF
  198.   addr.family := AF_INET
  199.   addr.port := htons(port)
  200. ENDPROC TRUE
  201.  
  202.  
  203.  
  204. PROC inetconn(addr:PTR TO sockaddr_in)
  205.  
  206.   ->-
  207.   ->- lov-level, poîâczenie (tryb NONBLOCKING) z hostem
  208.   ->- zwraca (-1) w przypadku bîëdu lub socketdescription (SD)
  209.   ->-
  210.  
  211.   DEF sd,one=1
  212.  
  213.   IF (sd := Socket(AF_INET, SOCK_STREAM, 0)) < 0
  214.     ->- netperror('socket')
  215.     RETURN (-1)
  216.   ENDIF
  217.   Setsockopt(sd, SOL_SOCKET, SO_KEEPALIVE, {one}, 1)
  218.     
  219.   IF (Connect(sd, addr, SIZEOF sockaddr_in)) < 0
  220.     CloseSocket(sd)
  221.     ->- netperror('connect')
  222.     RETURN (-1)
  223.   ENDIF
  224. ENDPROC sd
  225.  
  226.  
  227.  
  228. /*
  229. PROC netperror(banner=NIL) IS EMPTY
  230. PROC netperror(banner=NIL:PTR TO CHAR)
  231.   ->- komunikat o bîëdzie z opisem generowanym przez TCP/IP
  232.   ->-
  233.  
  234.   DEF taglist[5]: ARRAY OF LONG,tmp
  235.   
  236.   tmp:=Errno()
  237.   taglist[0] := SBTM_GETVAL(SBTC_ERRNO)
  238.   taglist[2] := SBTM_GETREF(SBTC_ERRNOSTRPTR)
  239.   taglist[3] := {tmp}
  240.   taglist[4] := TAG_DONE
  241.  
  242.   SocketBaseTagList(taglist)
  243.   informUser('%s: %s',NIL,[IF (banner) THEN banner ELSE 'TCP/IP', tmp, NIL])
  244. ENDPROC
  245. */
  246.  
  247.  
  248.  
  249. PROC bcopy(src, dst, len)
  250.  
  251.   ->-
  252.   ->- kopiowanie len bajtów spod adresu src do dst
  253.   ->- nie zwraca ûadnej wartoôci
  254.   ->-
  255.  
  256.     MOVE.L  len,D0
  257.     SUBQ.L  #1,D0
  258.     MOVE.L  src,A0
  259.     MOVE.L  dst,A1
  260.   bcopy_loop:
  261.     MOVE.B  (A0)+,(A1)+
  262.     DBRA.B  D0,bcopy_loop
  263. ENDPROC
  264.  
  265.  
  266.  
  267. PROC bzero(src, len)
  268.  
  269.   ->-
  270.   ->- czyszczenie (ustawianie na 0) len bajtów od adresu src
  271.   ->- nie zwraca ûadnej wartoôci
  272.   ->-
  273.  
  274.     MOVE.L  src,A0
  275.     MOVE.L  len,D0
  276.     SUBQ.L  #1,D0
  277.   bzero_loop:
  278.     MOVE.B  #0,(A0)+
  279.     DBRA.B  D0,bzero_loop
  280. ENDPROC
  281.